{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "#from sklearn.metrics import log_loss  \n",
    "#SVM并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\Anaconda2\\lib\\site-packages\\ipykernel_launcher.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "f:\\Anaconda2\\lib\\site-packages\\ipykernel_launcher.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "f:\\Anaconda2\\lib\\site-packages\\ipykernel_launcher.py:19: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    }
   ],
   "source": [
    "# 读取数据\n",
    "# path to where the data lies\n",
    "dpath = './'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "test  = pd.read_csv(dpath +\"RentListingInquries_FE_test.csv\")\n",
    "#将每一类的样本剥离出来，以便后续按照等比例进行数据采样\n",
    "\n",
    "y_train=train[\"interest_level\"]\n",
    "y_train_class0 = y_train[y_train==0]\n",
    "y_train_class1 = y_train[y_train==1]\n",
    "y_train_class2 = y_train[y_train==2]\n",
    "\n",
    "train_class0 = train[train[\"interest_level\"]==0]\n",
    "train_class1 = train[train[\"interest_level\"]==1]\n",
    "train_class2 = train[train[\"interest_level\"]==2]\n",
    "\n",
    "train_class0.drop([\"interest_level\"],axis=1,inplace = True)\n",
    "train_class1.drop([\"interest_level\"],axis=1,inplace = True)\n",
    "train_class2.drop([\"interest_level\"],axis=1,inplace = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "test_id=test[\"listing_id\"]\n",
    "test.drop(['listing_id'],axis=1,inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>latitude</th>\n",
       "      <th>longitude</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>...</th>\n",
       "      <th>virtual</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>40.7388</td>\n",
       "      <td>-74.0018</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>40.7488</td>\n",
       "      <td>-73.9770</td>\n",
       "      <td>3000</td>\n",
       "      <td>1500.0</td>\n",
       "      <td>1000.0</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>40.8335</td>\n",
       "      <td>-73.9141</td>\n",
       "      <td>1350</td>\n",
       "      <td>675.0</td>\n",
       "      <td>675.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>40.7649</td>\n",
       "      <td>-73.9763</td>\n",
       "      <td>1980</td>\n",
       "      <td>990.0</td>\n",
       "      <td>1980.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>64</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>40.7796</td>\n",
       "      <td>-73.9493</td>\n",
       "      <td>2200</td>\n",
       "      <td>1100.0</td>\n",
       "      <td>1100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 224 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    bathrooms  bedrooms  latitude  longitude  price  price_bathrooms  \\\n",
       "2         1.0         1   40.7388   -74.0018   2850           1425.0   \n",
       "12        1.0         2   40.7488   -73.9770   3000           1500.0   \n",
       "28        1.0         1   40.8335   -73.9141   1350            675.0   \n",
       "37        1.0         0   40.7649   -73.9763   1980            990.0   \n",
       "64        1.0         1   40.7796   -73.9493   2200           1100.0   \n",
       "\n",
       "    price_bedrooms  room_diff  room_num  Year  ...   virtual  walk  walls  \\\n",
       "2           1425.0        0.0       2.0  2016  ...         0     0      0   \n",
       "12          1000.0       -1.0       3.0  2016  ...         0     0      0   \n",
       "28           675.0        0.0       2.0  2016  ...         0     0      0   \n",
       "37          1980.0        1.0       1.0  2016  ...         0     0      0   \n",
       "64          1100.0        0.0       2.0  2016  ...         0     0      0   \n",
       "\n",
       "    war  washer  water  wheelchair  wifi  windows  work  \n",
       "2     0       0      0           0     0        0     0  \n",
       "12    0       0      0           0     0        0     0  \n",
       "28    0       0      0           0     0        0     0  \n",
       "37    1       0      0           0     0        0     0  \n",
       "64    0       0      0           0     0        0     0  \n",
       "\n",
       "[5 rows x 224 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_class0.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xd1fc668>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 看看各类样本分布是否均衡\n",
    "sns.countplot(y_train);\n",
    "pyplot.xlabel('interest level');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train_class0 = np.array(train_class0)\n",
    "X_train_class1 = np.array(train_class1)\n",
    "X_train_class2 = np.array(train_class2)\n",
    "\n",
    "X_test = np.array(test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据分割"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\Anaconda2\\lib\\site-packages\\sklearn\\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.cross_validation import train_test_split\n",
    "\n",
    "# 随机采样20%的数据构建测试样本，其余作为训练样本\n",
    "X_train_class0_part, X_test_class0_part, y_train_class0_part, y_test_calss0_part = train_test_split(X_train_class0, y_train_class0, random_state=33, test_size=0.8)\n",
    "X_train_class1_part, X_test_class1_part, y_train_class1_part, y_test_calss1_part = train_test_split(X_train_class1, y_train_class1, random_state=33, test_size=0.8)\n",
    "X_train_class2_part, X_test_class2_part, y_train_class2_part, y_test_calss2_part = train_test_split(X_train_class2, y_train_class2, random_state=33, test_size=0.8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#将分割的数据集组合成新的数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('the num of x downSample trainsets', (9868L, 224L))\n",
      "('the total num of x train sets', (49352, 225))\n",
      "('the num of y downSample trainsets', (9868L,))\n",
      "('the total num of y train sets', (49352, 225))\n"
     ]
    }
   ],
   "source": [
    "X_train_downSample = np.row_stack([X_train_class0_part,X_train_class1_part,X_train_class2_part])\n",
    "y_train_downSample = np.append(y_train_class0_part,y_train_class1_part)\n",
    "y_train_downSample = np.append(y_train_downSample,y_train_class2_part)\n",
    "\n",
    "print(\"the num of x downSample trainsets\",X_train_downSample.shape)\n",
    "print(\"the total num of x train sets\",train.shape)\n",
    "\n",
    "print(\"the num of y downSample trainsets\",y_train_downSample.shape)\n",
    "print(\"the total num of y train sets\",train.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#写入CSV查看分离的数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_separate_result=pd.DataFrame(X_train_downSample)\n",
    "df_separate_result[\"insterestlevl\"]=y_train_downSample.reshape(-1,1)\n",
    "df_separate_result.to_csv('separate_train.csv',header=True,index_label='Id')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train_downSample_trans = ss_X.fit_transform(X_train_downSample)\n",
    "X_test_downSample_trans = ss_X.fit_transform(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#首先分离出训练集 和验证集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 训练样本用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_validate, y_train_part, y_validate = train_test_split(X_train_downSample_trans, y_train_downSample, train_size = 0.8,random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "### default SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#LinearSVC不能得到每类的概率，在Otto数据集要求输出每类的概率，这里只是示意SVM的使用方法\n",
    "#https://xacecask2.gitbooks.io/scikit-learn-user-guide-chinese-version/content/sec1.4.html\n",
    "#1.4.1.2. 得分与概率\n",
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1 = LinearSVC().fit(X_train_part, y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.30      0.02      0.04       145\n",
      "          1       0.42      0.17      0.24       429\n",
      "          2       0.75      0.96      0.84      1400\n",
      "\n",
      "avg / total       0.64      0.72      0.65      1974\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[   3   43   99]\n",
      " [   3   71  355]\n",
      " [   4   56 1340]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics  \n",
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_validate)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, metrics.classification_report(y_validate, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_val, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线性SVM正则参数调优"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线性SVM LinearSVC的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1） \n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.696555217832\n",
      "accuracy: 0.713779128673\n",
      "accuracy: 0.717325227964\n",
      "accuracy: 0.715805471125\n",
      "accuracy: 0.715805471125\n",
      "accuracy: 0.719351570415\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.601317122594\n",
      "accuracy: 0.636778115502\n",
      "accuracy: 0.656534954407\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3XmYU/XZxvHvw6a4ICjjxiYqVEFa\nlxGquICJFqt1qVZB69Jaad+iFheoClbFVq3WtWItblVbxV2oooCgYBWsQ0EREAVUHLGCIAqisj3v\nH79MCcNAMkNOTpK5P9eVayZnTpIng+ae81vN3REREdmUBnEXICIihU9hISIiGSksREQkI4WFiIhk\npLAQEZGMFBYiIpKRwkJERDJSWIiISEYKCxERyahR3AXkSsuWLX233XaLuwwRkaIyZcqUz9y9LNN5\nJRMWu+22GxUVFXGXISJSVMzsw2zOUzOUiIhkpLAQEZGMFBYiIpJRpGFhZr3MbLaZzTGzS2v4+S1m\nNi11e9fMlqaO72tmk8xshpm9ZWanRlmniIhsWmQd3GbWEBgKHAlUAm+Y2Uh3n1l1jrtfmHb++cB+\nqbsrgDPd/T0z2xWYYmaj3X1pVPWKiMjGRXll0RWY4+7z3H0lMBw4fhPn9wEeAXD3d939vdT3C4CF\nQMahXSIiEo0ow6IV8FHa/crUsQ2YWTugPTC+hp91BZoAcyOoUUREshDlPAur4djG9nDtDTzh7mvW\newKzXYCHgLPcfe0GL2DWF+gL0LZt282rVqTAuMOHH8L06fDuu3DyydCuXdxVSX0VZVhUAm3S7rcG\nFmzk3N5Av/QDZtYMeA4Y7O6Ta3qQuw8DhgGUl5drM3EpWosXw9tvh2Cour39Nixbtu6cd96Bu++O\nr0ap36IMizeADmbWHviYEAinVT/JzL4DtAAmpR1rAjwNPOjuj0dYo0heffMNzJy5fihMnw6ffLLu\nnBYtoEsXOPPM8LVLF/j972HcuPjqFoksLNx9tZmdB4wGGgL3ufsMMxsCVLj7yNSpfYDh7p5+ZXAK\ncBiwg5mdnTp2trtPi6peCVavhs8+Cx9YW2wRdzXFa+1amDdvw1B4773wMwi/306dIJlcFwpdusCu\nu4JVa8T94Q/h+efDc+6+e/7fj4it/xldvMrLy11rQ2XPHT7+eMMPs1mzYOXKcM7WW0PLlrDDDutu\n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\nREQy+n9cBdIxLh4DuAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1c4fea20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数 默认L2正则\n",
    "C_s = np.logspace(-5, 5, 10)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "#    for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train_part, y_train_part, X_validate, y_validate)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-5.         -3.88888889 -2.77777778 -1.66666667 -0.55555556  0.55555556\n",
      "  1.66666667  2.77777778  3.88888889  5.        ]\n"
     ]
    }
   ],
   "source": [
    "print(x_axis)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最佳值在C=0.5555556时"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# test集进行预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "SVC_PREDICT =  LinearSVC( C = 0.5555556)\n",
    "SVC_PREDICT = SVC_PREDICT.fit(X_train_part, y_train_part)\n",
    "SVC_test_predict=SVC_PREDICT.predict(X_test_downSample_trans)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "predict_result = pd.DataFrame(SVC_test_predict,index=test_id,columns=[\"interest_level\"])\n",
    "y_map={2:'low',1:'medium',0:'high'}\n",
    "predict_result['interest_level']=predict_result['interest_level'].apply(lambda x:y_map[x])\n",
    "predict_result.to_csv('predict_result.csv',header=True,index_label='id')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "RBF核SVM正则参数调优\n",
    "RBF核是SVM最常用的核函数。 RBF核SVM 的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma C越小，决策边界越平滑； gamma越小，决策边界越平滑。\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709726443769\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.710233029382\n",
      "accuracy: 0.690982776089\n",
      "accuracy: 0.711246200608\n",
      "accuracy: 0.710233029382\n",
      "accuracy: 0.70820668693\n",
      "accuracy: 0.656028368794\n",
      "accuracy: 0.711246200608\n",
      "accuracy: 0.710233029382\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-3, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-3, 2, 4)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train_part, y_train_part, X_validate, y_validate)\n",
    "        accuracy_s.append(tmp)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709726443769\n",
      "accuracy: 0.709726443769\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.710233029382\n",
      "accuracy: 0.709726443769\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.710233029382\n",
      "accuracy: 0.709726443769\n",
      "accuracy: 0.709219858156\n",
      "accuracy: 0.709219858156\n"
     ]
    }
   ],
   "source": [
    "#调小sigma的值\n",
    "C_s = np.logspace(-1, 2, 4)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(3, 6, 4)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train_part, y_train_part, X_validate, y_validate)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZgAAAEKCAYAAAAvlUMdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xd8FOX2+PHPSSCE3nvoIBCQGkiw\ngqIiSlFRiigqRUW8lt/1ql+96per92u9XhU7ItgARQRUBAFRLBBI6J2AIKF3Aph+fn/sJi6QsimT\n2STn/Xrti52ZZ2bPs1n27DPljKgqxhhjTGELcjsAY4wxJZMlGGOMMY6wBGOMMcYRlmCMMcY4whKM\nMcYYR1iCMcYY4whLMMYYYxxhCcYYY4wjLMEYY4xxRBm3A3BTrVq1tGnTpm6HYYwxxUpsbOxhVa2d\nW7tSnWCaNm1KTEyM22EYY0yxIiK7/Glnu8iMMcY4whKMMcYYR1iCMcYY44hSfQwmKykpKcTHx5OY\nmOh2KKYYCw0NJSwsjLJly7odijGusQRzjvj4eCpXrkzTpk0REbfDMcWQqnLkyBHi4+Np1qyZ2+EY\n4xrbRXaOxMREatasacnF5JuIULNmTRsFm1LPEkwWLLmYgrLPkDG2i8wY46C4gwl8vWYfdmv2wHNl\n27p0bFTN0dewBBPAIiMjSUpK4ujRo/z55580bNgQgFmzZpGXCgQzZ84kPDycNm3a5On1L7nkEiZM\nmECnTp3ytF6Gl19+mQYNGjBs2LB8rV8Ubr75Zl544QWaN28OwFVXXcWhQ4dISUnh8ssv54033iA4\nOPisdVSV++67j++//56KFSsyZcqUfL9HJdma3ce57YNoTiamYgO6wFOnSqglmNIsOjoagMmTJxMT\nE8OECRPytZ2ZM2cSFBSU5wRTECkpKXz88cesXLmyyF4zP+655x5eeukl3n77bQC+/PJLqlSpQnp6\nOjfeeCNfffUVgwYNOmudr7/+mt27dxMXF8cvv/zCfffdx6+//upG+AErdtdR7pi0gmoVyzL3gUsJ\nq17B7ZCMC+wYTDH13Xff0aNHD7p06cLgwYM5ffo0AI888gjh4eF06NCBRx99lJ9//pm5c+fy0EMP\n0alTJ3bu3Jmv1/vkk0+48MILad++Pf/zP/+TOf/dd9/lggsuoGfPnowaNYoHH3wQgAULFtCtW7fM\nX//Lli2jQ4cOXHTRRTzyyCOZv/i3b9/OpZdeSufOnenatWtmUl24cCG9evVi0KBBtGrViieffJKP\nPvqIbt260aFDh8x+DB8+nPvuu49evXrRokULlixZwogRI2jTpg0jR47MjHPMmDFERETQrl07xo8f\nnzm/Z8+ezJs3j7S0NACqVKkCQFpaGklJSVkeS5k9eza333474Bnl7d+/n0OHDuXrfS2Joncc4bYP\nllOrcjk+v7uHJZdSzNERjIj0AV4DgoGJqvr8OctfBXp5JysAdVS1mnfZPCAK+EVVr/dZpxkwDagB\nrARuU9VkEXkYGAWkAoeAu1TVr3o52fnfrzewce/JgmziPOENqvB0v3YF2sbBgwd5/vnnWbRoERUq\nVOC5557jtddeY+TIkcydO5cNGzYgIhw/fpxq1arRt29fBg0axMCBA/P1evHx8Tz55JPExMRQtWpV\nevfuzTfffEPHjh15/vnnWblyJRUrVqRnz550794dgF9//ZWuXbtmbuPOO+9kypQpdO/enb///e+Z\n8+vXr8+CBQsIDQ1l8+bNjBgxIjPJrFmzhk2bNlG1alWaNm3K2LFjWbFiBa+88goTJkzg5ZdfBuDE\niRMsXryYL7/8kn79+rF06VLatGlDly5dWL9+Pe3bt+f555+nRo0apKamZiau8PBwgoODadq0KevX\nr6djx44A9O7dm9jYWK6//npuuOGG896PPXv20KhRo8zpsLAw9uzZQ+3audb+K/F+jTvMyCkrCKte\ngc9GRVKnSqjbIRkXOTaCEZFg4E3gWiAcGCoi4b5tVPUhVe2kqp2AN4CZPotfAm7LYtMvAK+qaivg\nGJDxM3UVEKGqHYAZwIuF2Z9A8ttvv7Fx40YuuugiOnXqxKeffsrOnTupUaMGQUFBjB49mq+++oqK\nFSsWyutFR0dzxRVXUKtWLcqWLcuwYcNYsmRJ5vzq1asTEhJy1q6kffv2ZX7hHj58mOTk5Mzk43tM\nJikpiZEjR9K+fXuGDBnCxo0bM5dFRkZSt25dQkNDad68Oddccw0AF1544VkjsX79+mXOb9CgAeHh\n4QQFBREeHp7ZburUqXTp0oUuXbqwadOms16nTp067N27N3N64cKF7N27l4SEBH766afz3o+sDljb\nWWPw45aD3DV5BU1rVmTamChLLsbREUx3IE5VdwCIyDRgALAxm/ZDgaczJlR1kYj09G0gnv/FVwAZ\n31BTgGeAt1V1sU/TZcDwgnagoCMNp6gqffr04eOPPz5vWUxMDAsWLGDatGm8/fbbfP/999lux/dL\n/8Ybb+Spp57K9vXyMh+gfPnymdeB5NTulVdeoVGjRnzyySekpKRQqVKlzGXlypXLfB4UFJQ5HRQU\nRGpq6nntfNv4ttu2bRuvvfYay5cvp1q1agwfPvysa1QSExMpX778efH369eP2bNn06tXr7OWhYWF\nsXv3bqKiogDPCK9BgwbZ9rE0WLjxAGM/XUmrupX4ZGQk1SuGuB2SCQBOHoNpCOz2mY73zjuPiDQB\nmgE/5LLNmsBxVc34dslumyOB7/IUbTFy0UUX8dNPP7Fjxw4ATp8+zbZt20hISODkyZNcf/31vPrq\nq6xatQqAypUrk5CQcN52QkJCWL16NatXr842uQBERUWxePFijhw5QmpqKtOmTePyyy8nMjKSxYsX\nc/z4cVJSUpg5868BaNu2bYmLiwOgdu3alC1bNvPWCNOmTctsd+LECerXr4+IMGXKFEdOZz158iSV\nK1emSpUq7Nu3j/nz55+1fNu2bbRr146EhAT2798PQGpqKt99912WJ0b079+fjz76CIBffvmFunXr\nlurdY/PW7+OeT2JpW78yn42KsuRiMjk5gslqn0F23x5DgBmqmlbQbYrIcCACuDzLDYiMAcYANG7c\nOJeXC0x169blgw8+YPDgwSQnJwPw73//m/Lly3PjjTeSlJREeno6//nPfwAYOnQod999N6+88kqe\nT3EGzy/28ePH07NnT1SVfv36cd111wGekwq6d+9Ow4YNadeuHVWrVgWgb9++Zx1knzRpEnfeeSeV\nK1fmsssuy2w3btw4Bg0axNSpU+ndu/dZI5DC0qVLF8LDw2nfvj3Nmzfn4osvzly2d+9eqlatSu3a\ntdm7dy8DBgzIfP969+7N6NGjAXjzzTcpV64co0aNol+/fnz33Xe0aNEi8zTl0mrOmr08NH01nRpV\n48M7u1El1GqvGR+q6sgD6AHM95l+HHg8m7argIuymN8T+MZnWoDDQJlsXqM3sAnPyQK5xti1a1c9\n18aNG8+bZ7KXkJCgqqrJycl67bXX6pw5czKX9evXT7dv335WO1XVZ599Vh9++OGiDTQbL774ok6e\nPNmRbZf0z9KMmN3a7LFv9OZ3ftOExBS3wzFFCIhRP75jndxFtgJoJSLNRCQEzyhlzrmNRKQ1UB1Y\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x110760b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
